#include <iostream>
using std::cout;
using std::endl;

class Point
{
public:
    /* Point() = default; */
    /* Point() */
    /* : _ix(0) */
    /* , _iy(0) */
    /* { */
    /*     cout << "Point()" << endl; */
    /* } */

    Point(int x = 0,int y = 0)
    : _ix(x)
    , _iy(y)
    {
        cout << "Point(int,int)" << endl;
    }

    ~Point(){
        cout << "~Point()" << endl;
    }

    Point(const Point & rhs)
    : _ix(rhs._ix)
    , _iy(rhs._iy)
    {
        cout << "Point(const Point&)" << endl;
    }


    void print(){
        cout << "(" << _ix
            << "," << _iy
            << ")";
    }
private:
    int _ix;
    int _iy;
};

class Line
{
public:
    Line(int x1,int y1,int x2,int y2)
    //如果在Line的构造函数的初始化列表中
    //没有显式调用Point的构造函数来初始化_pt1,_pt2
    //那么会自动调用Point的无参构造函数(调用形式上无参)
    //如果Point没有无参构造函数，会直接报错
    : _pt1(x1,y1)//显式调用了Point的有参构造
    , _pt2(x2,y2)
    {
        cout << "Line(int*4)" << endl;
    }

    ~Line(){
        cout << "~Line()" << endl;
    }

    void printLine(){
        _pt1.print();
        cout << "------->";
        _pt2.print();
        cout << endl;
    }
private:
    //此处声明了两个Point类型的对象成员、
    //创建一个Line对象，在对象的内存布局中会包含
    //两个Point类型的对象，称为成员子对象
    Point _pt1;
    Point _pt2;
};


void test0(){
    cout << sizeof(Line) << endl;
    //创建Line对象会马上调用Line的构造函数
    //在Line的构造函数执行过程中调用Point的构造函数
    //Line对象要销毁，就会马上调用Line的析构函数
    //Line的析构函数执行完之后，再根据对象成员声明的反序
    //通过成员子对象调用Point的析构函数
    //此处就是_pt2调用析构函数，执行完后，_pt1再调用析构函数
    Line ll(1,2,3,4);
    ll.printLine();
}

int main(void){
    test0();
    return 0;
}
